home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / Drivers / play3401 / scsicommands.c < prev    next >
C/C++ Source or Header  |  1994-03-02  |  10KB  |  326 lines

  1. /* -*-C-*-
  2. *******************************************************************************
  3. *
  4. * File:         scsicommands.c
  5. * RCS:          /usr/local/lib/cvs/play3401/scsicommands.c,v 1.2 1994/03/03 19:10:44 cedman Exp
  6. * Description:  Execute commands directly to the SCSI drive
  7. * Author:       Carl Edman
  8. * Created:      Sat May  8 23:07:42 1993
  9. * Modified:     Mon Jan 31 13:33:37 1994 (Carl Edman) cedman@capitalist.princeton.edu
  10. * Language:     C
  11. * Package:      N/A
  12. * Status:       Alpha
  13. *
  14. * (C) Copyright 1993, but otherwise this file is perfect freeware.
  15. *
  16. *******************************************************************************
  17. */
  18. #include <stdlib.h>
  19. #include <stdio.h>
  20. #include <string.h>
  21. #include <errno.h>
  22. #include <libc.h>
  23. #include <sys/file.h>
  24. #include <sys/types.h>
  25. #include <bsd/dev/scsireg.h>
  26. #include <bsd/dev/disk.h>
  27. #include "scsicommands.h"
  28.  
  29. static int to=0;
  30. static int fd=-1;
  31.  
  32. void scsierror(struct scsi_req *srp)
  33.    {
  34.    int i;
  35.    i=1+1;
  36.    }
  37.  
  38. int scsigetdev(const char *id)
  39.    {
  40.    char name[1024];
  41.    int f,i;
  42.    struct drive_info di;
  43.    for(i=0;;i++)
  44.       {
  45.       sprintf(name,"/dev/rsd%dh",i);
  46.       if ((f=open(name,O_RDONLY))==-1)
  47.          {
  48.          fprintf(stderr,"No free generic SCSI device\n");
  49.          return -1;
  50.          }
  51.       if (ioctl(f,DKIOCINFO,&di)==-1)
  52.          {
  53.          fprintf(stderr,"Ioctl(DKIOCINFO): %s\n",strerror(errno)); 
  54.      return -1;
  55.      }
  56.       if (!strncmp(di.di_name,id,strlen(id))) break;
  57.       close(f);
  58.       }
  59.    fd=f;
  60.    return fd;
  61.    }
  62.  
  63. int scsisettimeout(int tm)
  64.    {
  65.    to=tm;
  66.    return to;
  67.    }
  68.  
  69. int scsiwrite6s(void *buf,int blen,u_char opcode,u_char lun,u_char spare,u_char opt,u_int len,u_char ctrl)
  70.    {
  71.    struct scsi_req srp;
  72.    bzero(&srp,sizeof(srp));
  73.    srp.sr_cdb.cdb_c6s.c6s_opcode=opcode;
  74.    srp.sr_cdb.cdb_c6s.c6s_lun=lun;
  75.    srp.sr_cdb.cdb_c6s.c6s_spare=spare;
  76.    srp.sr_cdb.cdb_c6s.c6s_opt=opt;
  77. #if __BIG_ENDIAN__
  78.    srp.sr_cdb.cdb_c6s.c6s_len=len;
  79. #elif __LITTLE_ENDIAN__
  80.    if (len > 0)
  81.       {
  82.       srp.sr_cdb.cdb_c6s.c6s_len0 = len & 0xFF;
  83.       srp.sr_cdb.cdb_c6s.c6s_len1 = (len >> 8) & 0xFF;
  84.       srp.sr_cdb.cdb_c6s.c6s_len2 = (len >> 16) & 0xFF;
  85.       }
  86.    else
  87.       srp.sr_cdb.cdb_c6s.c6s_len0 = srp.sr_cdb.cdb_c6s.c6s_len1 =
  88.          srp.sr_cdb.cdb_c6s.c6s_len2 = 0;
  89. #endif
  90.    srp.sr_cdb.cdb_c6s.c6s_ctrl=ctrl;
  91.    srp.sr_addr=buf;
  92.    srp.sr_dma_max=blen;
  93.    srp.sr_dma_dir=SR_DMA_WR;
  94.    srp.sr_ioto=to;
  95.    ioctl(fd, SDIOCSRQ,&srp);
  96.    if (srp.sr_io_status!=0) { scsierror(&srp); return -1; }
  97.    return 0;
  98.    }
  99.  
  100. int scsiwrite10(void *buf,int blen,u_char opcode,u_char lun,u_char dp0,u_char fua,u_char mbz1,u_char reladr,u_int lba,u_char mbz2,u_short len,u_char ctrl)
  101.    {
  102.    struct scsi_req srp;
  103.    bzero(&srp,sizeof(srp));
  104.    srp.sr_cdb.cdb_c10.c10_opcode=opcode;
  105.    srp.sr_cdb.cdb_c10.c10_lun=lun;
  106.    srp.sr_cdb.cdb_c10.c10_dp0=dp0;
  107.    srp.sr_cdb.cdb_c10.c10_fua=fua;
  108.    srp.sr_cdb.cdb_c10.c10_mbz1=mbz1;
  109.    srp.sr_cdb.cdb_c10.c10_reladr=reladr;
  110. #if __BIG_ENDIAN__
  111.    srp.sr_cdb.cdb_c10.c10_lba=lba;
  112. #elif __LITTLE_ENDIAN__
  113.    if (lba > 0)
  114.       {
  115.       srp.sr_cdb.cdb_c10.c10_lba0 = lba & 0xFF;
  116.       srp.sr_cdb.cdb_c10.c10_lba1 = (lba >> 8) & 0xFF;
  117.       srp.sr_cdb.cdb_c10.c10_lba2 = (lba >> 16) & 0xFF;
  118.       srp.sr_cdb.cdb_c10.c10_lba3 = (lba >> 24) & 0xFF;
  119.    } else
  120.       srp.sr_cdb.cdb_c10.c10_lba0 = srp.sr_cdb.cdb_c10.c10_lba1
  121.          = srp.sr_cdb.cdb_c10.c10_lba2 = srp.sr_cdb.cdb_c10.c10_lba3 = 0;
  122. #endif
  123.    srp.sr_cdb.cdb_c10.c10_mbz2=mbz2;
  124. #if __BIG_ENDIAN__
  125.    srp.sr_cdb.cdb_c10.c10_len=len;
  126. #elif __LITTLE_ENDIAN__
  127.    if (len > 0)
  128.       {
  129.       srp.sr_cdb.cdb_c10.c10_len0 = len & 0xFF;
  130.       srp.sr_cdb.cdb_c10.c10_len1 = (len >> 8) & 0xFF;
  131.       }
  132.    else
  133.       srp.sr_cdb.cdb_c10.c10_len0 = srp.sr_cdb.cdb_c10.c10_len1 = 0;
  134. #endif
  135.    srp.sr_cdb.cdb_c10.c10_ctrl=ctrl;
  136.    srp.sr_addr=buf;
  137.    srp.sr_dma_max=blen;
  138.    srp.sr_dma_dir=SR_DMA_WR;
  139.    srp.sr_ioto=to;
  140.    ioctl(fd,SDIOCSRQ,&srp);
  141.    if (srp.sr_io_status!=0) { scsierror(&srp); return -1; }
  142.    return 0;
  143.    }
  144.  
  145. int scsiwrite12(void *buf,int blen,u_char opcode,u_char lun,u_char dp0,u_char fua,u_char mbz1,u_char reladr,u_int lba,u_char mbz2,u_char mbz3,u_char mbz4,u_short len,u_char ctrl)
  146.    {
  147.    struct scsi_req srp;
  148.    bzero(&srp,sizeof(srp));
  149.    srp.sr_cdb.cdb_c12.c12_opcode=opcode;
  150.    srp.sr_cdb.cdb_c12.c12_lun=lun;
  151.    srp.sr_cdb.cdb_c12.c12_dp0=dp0;
  152.    srp.sr_cdb.cdb_c12.c12_fua=fua;
  153.    srp.sr_cdb.cdb_c12.c12_mbz1=mbz1;
  154.    srp.sr_cdb.cdb_c12.c12_reladr=reladr;
  155. #if __BIG_ENDIAN__
  156.    srp.sr_cdb.cdb_c12.c12_lba=lba;
  157. #elif __LITTLE_ENDIAN__
  158.    if (lba > 0)
  159.       {
  160.       srp.sr_cdb.cdb_c12.c12_lba0 = lba & 0xFF;
  161.       srp.sr_cdb.cdb_c12.c12_lba1 = (lba >> 8) & 0xFF;
  162.       srp.sr_cdb.cdb_c12.c12_lba2 = (lba >> 16) & 0xFF;
  163.       srp.sr_cdb.cdb_c12.c12_lba3 = (lba >> 24) & 0xFF;
  164.       }
  165.    else
  166.       srp.sr_cdb.cdb_c12.c12_lba0 = srp.sr_cdb.cdb_c12.c12_lba1
  167.          = srp.sr_cdb.cdb_c12.c12_lba2 = srp.sr_cdb.cdb_c12.c12_lba3 = 0;
  168. #endif
  169.    srp.sr_cdb.cdb_c12.c12_mbz2=mbz2;
  170.    srp.sr_cdb.cdb_c12.c12_mbz3=mbz3;
  171.    srp.sr_cdb.cdb_c12.c12_mbz4=mbz4;
  172. #if __BIG_ENDIAN__
  173.    srp.sr_cdb.cdb_c12.c12_len=len;
  174. #elif __LITTLE_ENDIAN__
  175.    if (len > 0)
  176.       {
  177.       srp.sr_cdb.cdb_c12.c12_len0 = len & 0xFF;
  178.       srp.sr_cdb.cdb_c12.c12_len1 = (len >> 8) & 0xFF;
  179.       }
  180.    else
  181.       srp.sr_cdb.cdb_c12.c12_len0 = srp.sr_cdb.cdb_c12.c12_len1 = 0;
  182. #endif
  183.    srp.sr_cdb.cdb_c12.c12_ctrl=ctrl;
  184.    srp.sr_addr=buf;
  185.    srp.sr_dma_max=blen;
  186.    srp.sr_dma_dir=SR_DMA_WR;
  187.    srp.sr_ioto=to;
  188.    ioctl(fd,SDIOCSRQ,&srp);
  189.    if (srp.sr_io_status!=0) { scsierror(&srp); return -1; }
  190.    return 0;
  191.    }
  192.  
  193. int scsiread6s(void *buf,int blen,u_char opcode,u_char lun,u_char spare,u_char opt,u_int len,u_char ctrl)
  194.    {
  195.    struct scsi_req srp;
  196.    bzero(&srp,sizeof(srp));
  197.    srp.sr_cdb.cdb_c6s.c6s_opcode=opcode;
  198.    srp.sr_cdb.cdb_c6s.c6s_lun=lun;
  199.    srp.sr_cdb.cdb_c6s.c6s_spare=spare;
  200.    srp.sr_cdb.cdb_c6s.c6s_opt=opt;
  201. #if __BIG_ENDIAN__
  202.    srp.sr_cdb.cdb_c6s.c6s_len=len;
  203. #elif __LITTLE_ENDIAN__
  204.    if (len > 0)
  205.       {
  206.       srp.sr_cdb.cdb_c6s.c6s_len0 = len & 0xFF;
  207.       srp.sr_cdb.cdb_c6s.c6s_len1 = (len >> 8) & 0xFF;
  208.       srp.sr_cdb.cdb_c6s.c6s_len2 = (len >> 16) & 0xFF;
  209.       }
  210.    else
  211.       srp.sr_cdb.cdb_c6s.c6s_len0 = srp.sr_cdb.cdb_c6s.c6s_len1
  212.          = srp.sr_cdb.cdb_c6s.c6s_len2 = 0;
  213. #endif
  214.    srp.sr_cdb.cdb_c6s.c6s_ctrl=ctrl;
  215.    srp.sr_addr=buf;
  216.    srp.sr_dma_max=blen;
  217.    srp.sr_dma_dir=SR_DMA_RD;
  218.    srp.sr_ioto=to;
  219.    ioctl(fd,SDIOCSRQ,&srp);
  220.    if (srp.sr_io_status!=0) { scsierror(&srp); return -1; }
  221.    return 0;
  222.    }
  223.  
  224. int scsiread10(void *buf,int blen,u_char opcode,u_char lun,u_char dp0,u_char fua,u_char mbz1,u_char reladr,u_int lba,u_char mbz2,u_short len,u_char ctrl)
  225.    {
  226.    struct scsi_req srp;
  227.    bzero(&srp,sizeof(srp));
  228.    srp.sr_cdb.cdb_c10.c10_opcode=opcode;
  229.    srp.sr_cdb.cdb_c10.c10_lun=lun;
  230.    srp.sr_cdb.cdb_c10.c10_dp0=dp0;
  231.    srp.sr_cdb.cdb_c10.c10_fua=fua;
  232.    srp.sr_cdb.cdb_c10.c10_mbz1=mbz1;
  233.    srp.sr_cdb.cdb_c10.c10_reladr=reladr;
  234. #if __BIG_ENDIAN__
  235.    srp.sr_cdb.cdb_c10.c10_lba=lba;
  236. #elif __LITTLE_ENDIAN__
  237.    if (lba > 0)
  238.       {
  239.       srp.sr_cdb.cdb_c10.c10_lba0 = lba & 0xFF;
  240.       srp.sr_cdb.cdb_c10.c10_lba1 = (lba >> 8) & 0xFF;
  241.       srp.sr_cdb.cdb_c10.c10_lba2 = (lba >> 16) & 0xFF;
  242.       srp.sr_cdb.cdb_c10.c10_lba3 = (lba >> 24) & 0xFF;
  243.       }
  244.    else
  245.       srp.sr_cdb.cdb_c10.c10_lba0 = srp.sr_cdb.cdb_c10.c10_lba1
  246.          = srp.sr_cdb.cdb_c10.c10_lba2 = srp.sr_cdb.cdb_c10.c10_lba3 = 0;
  247. #endif
  248.    srp.sr_cdb.cdb_c10.c10_mbz2=mbz2;
  249. #if __BIG_ENDIAN__
  250.    srp.sr_cdb.cdb_c10.c10_len=len;
  251. #elif __LITTLE_ENDIAN__
  252.    if (len > 0)
  253.       {
  254.       srp.sr_cdb.cdb_c10.c10_len0 = len & 0xFF;
  255.       srp.sr_cdb.cdb_c10.c10_len1 = (len >> 8) & 0xFF;
  256.       }
  257.    else
  258.       srp.sr_cdb.cdb_c10.c10_len0 = srp.sr_cdb.cdb_c10.c10_len1 = 0;
  259. #endif
  260.    srp.sr_cdb.cdb_c10.c10_ctrl=ctrl;
  261.    srp.sr_addr=buf;
  262.    srp.sr_dma_max=blen;
  263.    srp.sr_dma_dir=SR_DMA_RD;
  264.    srp.sr_ioto=to;
  265.    ioctl(fd,SDIOCSRQ,&srp);
  266.    if (srp.sr_io_status!=0) { scsierror(&srp); return -1; }
  267.    return 0;
  268.    }
  269.  
  270. int scsiread12(void *buf,int blen,u_char opcode,u_char lun,u_char dp0,u_char fua,u_char mbz1,u_char reladr,u_int lba,u_char mbz2,u_char mbz3,u_char mbz4,u_short len,u_char ctrl)
  271.    {
  272.    struct scsi_req srp;
  273.    bzero(&srp,sizeof(srp));
  274.    srp.sr_cdb.cdb_c12.c12_opcode=opcode;
  275.    srp.sr_cdb.cdb_c12.c12_lun=lun;
  276.    srp.sr_cdb.cdb_c12.c12_dp0=dp0;
  277.    srp.sr_cdb.cdb_c12.c12_fua=fua;
  278.    srp.sr_cdb.cdb_c12.c12_mbz1=mbz1;
  279.    srp.sr_cdb.cdb_c12.c12_reladr=reladr;
  280. #if __BIG_ENDIAN__
  281.    srp.sr_cdb.cdb_c12.c12_lba=lba;
  282. #elif __LITTLE_ENDIAN__
  283.    if (lba > 0)
  284.       {
  285.       srp.sr_cdb.cdb_c12.c12_lba0 = lba & 0xFF;
  286.       srp.sr_cdb.cdb_c12.c12_lba1 = (lba >> 8) & 0xFF;
  287.       srp.sr_cdb.cdb_c12.c12_lba2 = (lba >> 16) & 0xFF;
  288.       srp.sr_cdb.cdb_c12.c12_lba3 = (lba >> 24) & 0xFF;
  289.       }
  290.    else
  291.       srp.sr_cdb.cdb_c12.c12_lba0 = srp.sr_cdb.cdb_c12.c12_lba1
  292.          = srp.sr_cdb.cdb_c12.c12_lba2 = srp.sr_cdb.cdb_c12.c12_lba3 = 0;
  293. #endif
  294.    srp.sr_cdb.cdb_c12.c12_mbz2=mbz2;
  295.    srp.sr_cdb.cdb_c12.c12_mbz3=mbz3;
  296.    srp.sr_cdb.cdb_c12.c12_mbz4=mbz4;
  297. #if __BIG_ENDIAN__
  298.    srp.sr_cdb.cdb_c12.c12_len=len;
  299. #elif __LITTLE_ENDIAN__
  300.    if (len > 0)
  301.       {
  302.       srp.sr_cdb.cdb_c12.c12_len0 = len & 0xFF;
  303.       srp.sr_cdb.cdb_c12.c12_len1 = (len >> 8) & 0xFF;
  304.       }
  305.    else
  306.       srp.sr_cdb.cdb_c12.c12_len0 = srp.sr_cdb.cdb_c12.c12_len1 = 0;
  307. #endif
  308.    srp.sr_cdb.cdb_c12.c12_ctrl=ctrl;
  309.    srp.sr_addr=buf;
  310.    srp.sr_dma_max=blen;
  311.    srp.sr_dma_dir=SR_DMA_WR;
  312.    srp.sr_ioto=to;
  313.    ioctl(fd,SDIOCSRQ,&srp);
  314.    if (srp.sr_io_status!=0) { scsierror(&srp); return -1; }
  315.    return 0;
  316.    }
  317.  
  318. int scsiclose(int eject)
  319.    {
  320.    int ret=0;
  321.    if (eject && ioctl(fd,DKIOCEJECT,0)==-1) ret=1;
  322.    close(fd);
  323.    fd=-1;
  324.    return ret;
  325.    }
  326.